home *** CD-ROM | disk | FTP | other *** search
/ Atari Forever 4 / Atari Forever 4.zip / Atari Forever 4.iso / PD_THEMA / EDITOREN / 7UP_PD / WREALSCR.C < prev   
C/C++ Source or Header  |  1998-03-14  |  5KB  |  128 lines

  1. /* Live scrolling des Fensterinhaltes */
  2. /*****************************************************************************
  3. *
  4. *                                              7UP
  5. *                                      Modul: WREALSCR.C
  6. *                                     (c) by TheoSoft '92
  7. *
  8. *****************************************************************************/
  9. #include <portab.h>
  10. #include <stdio.h>
  11. #include <aes.h>
  12.  
  13. #include "windows.h"
  14.  
  15. #define VERTICAL    1
  16. #define HORIZONTAL 2
  17. #define notnull(a) ((a>0)?(a):(1))
  18.  
  19. #define EXOB_TYPE(x) (x>>8)
  20. #define WP_YWORK(y) (wp->toolbar?(EXOB_TYPE(wp->toolbar->ob_type)==0?(y-wp->toolbar->ob_height):y):y)
  21. #define WP_HWORK(h) (wp->toolbar?(EXOB_TYPE(wp->toolbar->ob_type)==0?(h+wp->toolbar->ob_height):h):h)
  22. #define WP_XWORK(x) (wp->toolbar?(EXOB_TYPE(wp->toolbar->ob_type)==1?(x-wp->toolbar->ob_width ):x):x)
  23. #define WP_WWORK(w) (wp->toolbar?(EXOB_TYPE(wp->toolbar->ob_type)==1?(w+wp->toolbar->ob_width ):w):w)
  24.  
  25. extern int boxw,boxh;
  26.  
  27. int isvertical(WINDOW *wp, int e_mx, int e_my)
  28. {                          /* Slider kann links oder rechts sein */
  29.     int x,y,w,h;
  30.     wind_calc(WC_BORDER,wp->kind,
  31.         wp->xwork,wp->ywork,wp->wwork,wp->hwork,
  32.         &x,&y,&w,&h);
  33.     if(((e_mx>WP_XWORK(wp->xwork)+WP_WWORK(wp->wwork) && e_mx<x+w) || /* rechts */
  34.          (e_mx>x && e_mx<WP_XWORK(wp->xwork))) &&                 /* links  */
  35.         (e_my>WP_YWORK(wp->ywork)+boxh && e_my<WP_YWORK(wp->ywork)+WP_HWORK(wp->hwork)-boxh) &&
  36.         wp->hsize>WP_HWORK(wp->hwork))
  37.         return(TRUE);                     /* Maus im vert. Slider */
  38.     else
  39.         return(FALSE);
  40. }
  41.  
  42. int ishorizontal(WINDOW *wp, int e_mx, int e_my)
  43. {                                     /* Slider kann nur unten sein */
  44.     int x,y,w,h;
  45.     wind_calc(WC_BORDER,wp->kind,
  46.         wp->xwork,wp->ywork,wp->wwork,wp->hwork,
  47.         &x,&y,&w,&h);
  48.     if((e_my>WP_YWORK(wp->ywork)+WP_HWORK(wp->hwork) && e_my<y+h) &&
  49.         (e_mx>WP_XWORK(wp->xwork)+boxw*2 && e_mx<WP_XWORK(wp->xwork)+WP_WWORK(wp->wwork)-boxw*2) &&
  50.         wp->wsize>WP_WWORK(wp->wwork))
  51.         return(TRUE);                      /* Maus im hor. Slider */
  52.     else
  53.         return(FALSE);
  54. }
  55.  
  56. void Wrealscroll(WINDOW *wp, int e_mx, int e_my, int dir)
  57. {
  58.     int mouse_click,pos, ret, slsize;
  59.     int mx,my,nx,ny;
  60.     
  61.     wind_update(BEG_MCTRL);
  62.     graf_mouse(M_OFF,NULL);
  63.     Wcursor(wp);
  64.     graf_mouse(M_ON,NULL);
  65.     graf_mouse(FLAT_HAND,NULL);
  66.     nx=mx=e_mx;
  67.     ny=my=e_my;
  68.     if(dir==VERTICAL)
  69.     {
  70.         _wind_get(wp->wihandle,WF_VSLSIZE,&slsize,&ret,&ret,&ret);
  71. /*
  72.         pos=(int)((long)((my-max((boxh+2)/2,(long)(wp->hwork-2*(boxh+2))*slsize/1000L/2))-(wp->ywork+(boxh+2)))*1000L/(long)notnull((long)(wp->hwork-2*(boxh+2))-max((boxh+2),(long)(wp->hwork-2*(boxh+2))*slsize/1000L)));
  73. */
  74.         pos=(int)((long)((my-max((boxh+2)/2,(long)(WP_HWORK(wp->hwork)-2*(boxh+2))*slsize/1000L/2))-(WP_YWORK(wp->ywork)+(boxh+2)))*1000L/(long)notnull((long)(WP_HWORK(wp->hwork)-2*(boxh+2))-max((boxh+2),(long)(WP_HWORK(wp->hwork)-2*(boxh+2))*slsize/1000L)));
  75.         graf_mouse(M_OFF,NULL);
  76.         Wslide(wp,min(max(0,pos),1000),VSLIDE); /* entsprechend Maus... */
  77.         graf_mouse(M_ON,NULL);
  78.         do
  79.         {
  80.             graf_mkstate(&mx,&my,&mouse_click,&ret); /* Position */
  81.             if(ny!=my && my>WP_YWORK(wp->ywork) && my<WP_YWORK(wp->ywork)+WP_HWORK(wp->hwork))
  82.             {
  83. /*
  84.                 pos=(int)((long)((my-max((boxh+2)/2,(long)(wp->hwork-2*(boxh+2))*slsize/1000L/2))-(wp->ywork+(boxh+2)))*1000L/(long)notnull((long)(wp->hwork-2*(boxh+2))-max((boxh+2),(long)(wp->hwork-2*(boxh+2))*slsize/1000L)));
  85. */
  86.                 pos=(int)((long)((my-max((boxh+2)/2,(long)(WP_HWORK(wp->hwork)-2*(boxh+2))*slsize/1000L/2))-(WP_YWORK(wp->ywork)+(boxh+2)))*1000L/(long)notnull((long)(WP_HWORK(wp->hwork)-2*(boxh+2))-max((boxh+2),(long)(WP_HWORK(wp->hwork)-2*(boxh+2))*slsize/1000L)));
  87.                 graf_mouse(M_OFF,NULL);
  88.                 Wslide(wp,min(max(0,pos),1000),VSLIDE); /* einstellen */
  89.                 graf_mouse(M_ON,NULL);
  90.                 Wsetrcinfo(wp);
  91.                 nx=mx;
  92.                 ny=my;
  93.             }
  94.         }
  95.         while(mouse_click); /* solange Maustaste gedrückt */
  96.     }
  97.     else
  98.     {
  99.         _wind_get(wp->wihandle,WF_HSLSIZE,&slsize,&ret,&ret,&ret);
  100.         pos=(int)((long)((mx-max((boxw*2+2)/2,(long)(WP_WWORK(wp->wwork)-2*(boxw*2+2))*slsize/1000L/2))-(WP_XWORK(wp->xwork)+(boxw*2+2)))*1000L/(long)notnull((long)(WP_WWORK(wp->wwork)-2*(boxw*2+2))-max((boxw*2+2),(long)(WP_WWORK(wp->wwork)-2*(boxw*2+2))*slsize/1000L)));
  101.         graf_mouse(M_OFF,NULL);
  102.         Wslide(wp,min(max(0,pos),1000),HSLIDE); /* entsprechend Maus... */
  103.         graf_mouse(M_ON,NULL);
  104.         do
  105.         {
  106.             graf_mkstate(&mx,&my,&mouse_click,&ret); /* Position */
  107.             if(nx!=mx && mx>WP_XWORK(wp->xwork) && mx<WP_XWORK(wp->xwork)+WP_WWORK(wp->wwork))
  108.             {
  109.                 pos=(int)((long)((mx-max((boxw*2+2)/2,(long)(WP_WWORK(wp->wwork)-2*(boxw*2+2))*slsize/1000L/2))-(WP_XWORK(wp->xwork)+(boxw*2+2)))*1000L/(long)notnull((long)(WP_WWORK(wp->wwork)-2*(boxw*2+2))-max((boxw*2+2),(long)(WP_WWORK(wp->wwork)-2*(boxw*2+2))*slsize/1000L)));
  110.                 graf_mouse(M_OFF,NULL);
  111.                 Wslide(wp,min(max(0,pos),1000),HSLIDE); /* einstellen */
  112.                 graf_mouse(M_ON,NULL);
  113.                 Wsetrcinfo(wp);
  114.                 nx=mx;
  115.                 ny=my;
  116.             }
  117.         }
  118.         while(mouse_click);
  119.     }
  120.     graf_mouse(ARROW,NULL);
  121.     graf_mouse(M_OFF,NULL);
  122.     Wcursor(wp);
  123.     graf_mouse(M_ON,NULL);
  124.     wind_update(END_MCTRL);
  125. }
  126. /*
  127.         pos=(int)((long)((my-max((boxh+2)/2,(long)(WP_HWORK-2*(boxh+2))*slsize/1000L/2))-(WP_YWORK+(boxh+2)))*1000L/(long)notnull((long)(WP_HWORK-2*(boxh+2))-max((boxh+2),(long)(WP_HWORK-2*(boxh+2))*slsize/1000L)));
  128. */